<?php
namespace app\common\service;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
class Token
{
    protected $salt;
    public function __construct()
    {
        //从配置信息这种或取唯一字符串，你可以随便写比如md5('token')
        $this->salt = md5('xtrbcn@');
    }
    /**
     * 生成token
     * @param $info 用户信息 避免敏感信息
     * @return mixed
     */
    public function generateToken($info)
    {
        //获取当前时间戳
        $currentTime = time();
        $data = array(
           // "iss" => 'xtwuc',        //签发者 可以为空
           // "aud" => 'xtw',             //面象的用户，可以为空
            "iat" => $currentTime,   //签发时间
            "nbf" => $currentTime,   //立马生效
            "exp" => $currentTime + 60*20, //token 过期时间 10分钟
            "data" => $info
        );
        //生成token
        $token = JWT::encode($data, $this->salt, "HS256");  //根据参数生成了 token
        return $token;
    }
        /**
     * 生成reftoken
     * @param $info 用户信息 避免敏感信息
     * @return mixed
     */
    public function refToken($info)
    {
        //获取当前时间戳
        $currentTime = time();
        $data = array(
            //"iss" => 'xtwuc',        //签发者 可以为空
            //"aud" => 'xtw',             //面象的用户，可以为空
            "iat" => $currentTime,   //签发时间
            "nbf" => $currentTime,   //立马生效
            "exp" => $currentTime + 60*60*12*7, //token 过期时间 7天 60*60*12*7
            "data" => $info
        );
        //生成token
        $token = JWT::encode($data, $this->salt, "HS256");  //根据参数生成了 token
        return $token;
    }

    /**
     * 校验token时效性
     */
    public function chekToken($token)
    {
        try {
            JWT::$leeway = 60;//当前时间减去60，把时间留点余地
            $decoded = JWT::decode($token, new Key($this->salt, 'HS256')); //HS256方式，这里要和签发的时候对应
            $arr = (array)$decoded;
           $res['data']=$arr['data'];
           //dump($arr['data']);
            return show($res['data'],'');

        } catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
            return fail('','签名不正确',403);
        }catch(\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
            return fail('','token失效',403);
        }catch(\Firebase\JWT\ExpiredException $e) { // token过期
            return fail('','token过期',401);
        }catch(\Exception $e) { //其他错误
           
            return fail($e->getMessage(),'未知错误',500);
        }
    }
}